<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML>
<HEAD>
<TITLE>80386 Programmer's Reference Manual -- Opcode LEAVE</TITLE>
</HEAD>
<BODY STYLE="width:80ch">
<B>up:</B> <A HREF="c17.htm">
Chapter 17 -- 80386 Instruction Set</A><BR>
<B>prev:</B><A HREF="LEA.htm"> LEA Load Effective Address</A><BR> 
<B>next:</B><A HREF="LGDT.htm"> LGDT/LIDT Load Global/Interrupt Descriptor Table Register</A>
<P>
<HR>
<P>
<H1>LEAVE -- High Level Procedure Exit</H1>

<PRE>
Opcode  Instruction  Clocks  Description

C9      LEAVE        4       Set SP to BP, then pop BP
C9      LEAVE        4       Set ESP to EBP, then pop EBP
</PRE>

<H2>Operation</H2>

<PRE>
IF StackAddrSize = 16
THEN
   SP := BP;
ELSE (* StackAddrSize = 32 *)
   ESP := EBP;
FI;
IF OperandSize = 16
THEN
   BP := Pop();
ELSE (* OperandSize = 32 *)
   EBP := Pop();
FI;
</PRE>

<H2>Description</H2>

LEAVE reverses the actions of the 
<A HREF="ENTER.htm">ENTER</A> instruction. By copying the
frame pointer to the stack pointer, LEAVE releases the stack space used
by a procedure for its local variables. The old frame pointer is popped
into BP or EBP, restoring the caller's frame. A subsequent 
<A HREF="RET.htm">RET</A>
instruction removes any arguments pushed onto the stack of the exiting
procedure.

<H2>Flags Affected</H2>

None

<H2>Protected Mode Exceptions</H2>

#SS(0) if BP does not point to a location within the limits of the current
stack segment

<H2>Real Address Mode Exceptions</H2>

Interrupt 13 if any part of the operand would lie outside of the effective
address space from 0 to 0FFFFH

<H2>Virtual 8086 Mode Exceptions</H2>

Same exceptions as in Real Address Mode


<P>
<HR>
<P>
<B>up:</B> <A HREF="c17.htm">
Chapter 17 -- 80386 Instruction Set</A><BR>
<B>prev:</B><A HREF="LEA.htm"> LEA Load Effective Address</A><BR> 
<B>next:</B><A HREF="LGDT.htm"> LGDT/LIDT Load Global/Interrupt Descriptor Table Register</A>
</BODY>
